def dfs(cnt, n, node, vis):
    # 当已经排列的元素数量达到 n 时，输出结果
    if cnt == n:
        print(*node[1:n + 1])  # 输出 1 到 n 的排列结果
        return

    # 遍历所有数字，进行排列
    for i in range(1, n + 1):
        if not vis[i]:  # 如果数字 i 没有被使用过
            vis[i] = 1  # 标记数字 i 为已使用
            node[cnt + 1] = i  # 添加元素
            dfs(cnt + 1, n, node, vis)  # 递归调用
            node[cnt + 1] = 0  # 移除元素，回溯
            vis[i] = 0  # 恢复数字 i 的状态，未使用


def main():
    n = int(input())  # 输入 n
    node = [0] * (n + 1)  # 存储排列结果，从索引 1 开始
    vis = [0] * (n + 1)  # 标记每个数字是否已被使用
    dfs(0, n, node, vis)  # 从第 0 个位置开始，排列的元素数量为 0


if __name__ == "__main__":
    main()